using System.Collections.Generic;
using UnityEngine;

namespace UnityStandardAssets.CrossPlatformInput {
    public abstract class VirtualInput {
        public Vector3 virtualMousePosition { get; private set; }


        protected Dictionary<string, CrossPlatformInputManager.VirtualAxis> m_VirtualAxes =
            new Dictionary<string, CrossPlatformInputManager.VirtualAxis>();

        // Dictionary to store the name relating to the virtual axes
        protected Dictionary<string, CrossPlatformInputManager.VirtualButton> m_VirtualButtons =
            new Dictionary<string, CrossPlatformInputManager.VirtualButton>();

        protected List<string> m_AlwaysUseVirtual = new List<string>();
        // list of the axis and button names that have been flagged to always use a virtual axis or button


        public bool AxisExists(string name) {
            return this.m_VirtualAxes.ContainsKey(name);
        }

        public bool ButtonExists(string name) {
            return this.m_VirtualButtons.ContainsKey(name);
        }


        public void RegisterVirtualAxis(CrossPlatformInputManager.VirtualAxis axis) {
            // check if we already have an axis with that name and log and error if we do
            if (this.m_VirtualAxes.ContainsKey(axis.name)) {
                Debuger.LogError("There is already a virtual axis named " + axis.name + " registered.");
            }
            else {
                // add any new axes
                this.m_VirtualAxes.Add(axis.name, axis);

                // if we dont want to match with the input manager setting then revert to always using virtual
                if (!axis.matchWithInputManager) {
                    this.m_AlwaysUseVirtual.Add(axis.name);
                }
            }
        }


        public void RegisterVirtualButton(CrossPlatformInputManager.VirtualButton button) {
            // check if already have a buttin with that name and log an error if we do
            if (this.m_VirtualButtons.ContainsKey(button.name)) {
                Debuger.LogError("There is already a virtual button named " + button.name + " registered.");
            }
            else {
                // add any new buttons
                this.m_VirtualButtons.Add(button.name, button);

                // if we dont want to match to the input manager then always use a virtual axis
                if (!button.matchWithInputManager) {
                    this.m_AlwaysUseVirtual.Add(button.name);
                }
            }
        }


        public void UnRegisterVirtualAxis(string name) {
            // if we have an axis with that name then remove it from our dictionary of registered axes
            if (this.m_VirtualAxes.ContainsKey(name)) {
                this.m_VirtualAxes.Remove(name);
            }
        }


        public void UnRegisterVirtualButton(string name) {
            // if we have a button with this name then remove it from our dictionary of registered buttons
            if (this.m_VirtualButtons.ContainsKey(name)) {
                this.m_VirtualButtons.Remove(name);
            }
        }


        // returns a reference to a named virtual axis if it exists otherwise null
        public CrossPlatformInputManager.VirtualAxis VirtualAxisReference(string name) {
            return this.m_VirtualAxes.ContainsKey(name) ? this.m_VirtualAxes[name] : null;
        }


        public void SetVirtualMousePositionX(float f) {
            this.virtualMousePosition = new Vector3(f, this.virtualMousePosition.y, this.virtualMousePosition.z);
        }


        public void SetVirtualMousePositionY(float f) {
            this.virtualMousePosition = new Vector3(this.virtualMousePosition.x, f, this.virtualMousePosition.z);
        }


        public void SetVirtualMousePositionZ(float f) {
            this.virtualMousePosition = new Vector3(this.virtualMousePosition.x, this.virtualMousePosition.y, f);
        }


        public abstract float GetAxis(string name, bool raw);

        public abstract bool GetButton(string name);
        public abstract bool GetButtonDown(string name);
        public abstract bool GetButtonUp(string name);

        public abstract void SetButtonDown(string name);
        public abstract void SetButtonUp(string name);
        public abstract void SetAxisPositive(string name);
        public abstract void SetAxisNegative(string name);
        public abstract void SetAxisZero(string name);
        public abstract void SetAxis(string name, float value);
        public abstract Vector3 MousePosition();
    }
}